package com.obelisco.modelo.servicios.seguridad;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import com.obelisco.modelo.dao.hibernate.CarpetaTransaccionDAO;
import com.obelisco.modelo.dao.hibernate.GrupoDAO;
import com.obelisco.modelo.dao.hibernate.OperacionDAO;
import com.obelisco.modelo.dao.hibernate.TipoDespliegueDAO;
import com.obelisco.modelo.dao.hibernate.TipoTransaccionDAO;
import com.obelisco.modelo.dao.hibernate.TransaccionDAO;
import com.obelisco.modelo.data.CarpetaTransaccion;
import com.obelisco.modelo.data.DataGenerica;
import com.obelisco.modelo.data.Grupo;
import com.obelisco.modelo.data.Operacion;
import com.obelisco.modelo.data.Sistema;
import com.obelisco.modelo.data.TipoTransaccion;
import com.obelisco.modelo.data.Transaccion;

public class  ServicioAdministrarCarpetas implements
		IServicioAdministrarCarpetas {

	CarpetaTransaccionDAO carpetaTransaccionDAO;

	TransaccionDAO transaccionDAO;

	OperacionDAO operacionDAO;
	
	GrupoDAO grupoDAO;
	
	TipoTransaccionDAO tipoTransaccionDAO;
	
	TipoDespliegueDAO tipoDespliegueDAO;

	Sistema sistema;

	public CarpetaTransaccion buscarArbol() {
		CarpetaTransaccion carpetaRaiz = carpetaTransaccionDAO
				.findTree(sistema);
		return carpetaRaiz;
	}

	public Sistema getSistema() {
		return sistema;
	}

	public void setSistema(Sistema sistema) {
		this.sistema = sistema;
	}

	public List buscarTodasCarpetas() {
		// TODO Auto-generated method stub
		return carpetaTransaccionDAO.findAll(CarpetaTransaccion.class);
	}

	public void guardarCarpeta(CarpetaTransaccion carpeta) {
		// TODO Auto-generated method stub
		carpetaTransaccionDAO.saveOrUpdate(carpeta);
	}

	public CarpetaTransaccionDAO getCarpetaTransaccionDAO() {
		return carpetaTransaccionDAO;
	}

	public void setCarpetaTransaccionDAO(
			CarpetaTransaccionDAO carpetaTransaccionDAO) {
		this.carpetaTransaccionDAO = carpetaTransaccionDAO;
	}

	public TransaccionDAO getTransaccionDAO() {
		return transaccionDAO;
	}

	public void setTransaccionDAO(TransaccionDAO transaccionDAO) {
		this.transaccionDAO = transaccionDAO;
	}

	public CarpetaTransaccion nuevaCarpeta(CarpetaTransaccion padre) {
		// TODO Auto-generated method stub
		CarpetaTransaccion nueva = new CarpetaTransaccion();
		nueva.setPadre(padre);
		nueva.setSistema(sistema);
		return nueva;
	}

	public Transaccion nuevaTransaccion(CarpetaTransaccion carpeta) {
		// TODO Auto-generated method stub
		Transaccion nueva = new Transaccion();
		nueva.setCarpeta(carpeta);
		nueva.setSistema(sistema);
		return nueva;
	}

	public List buscarOperacionesDisponibles(Transaccion transaccion) {
		// TODO Auto-generated method stub
		List disponibles = new ArrayList();
		List operaciones = operacionDAO.loadAll();

		for (Iterator i = operaciones.iterator(); i.hasNext();) {
			Operacion operacion = (Operacion) i.next();

			boolean fueAsignado = false;
			for (Iterator j = transaccion.getOperaciones().iterator(); j
					.hasNext();) {
				Operacion asignada = (Operacion) j.next();
				if (asignada.getCodigo().equals(operacion.getCodigo())) {
					fueAsignado = true;
					break;
				}

			}
			if (!fueAsignado) {
				disponibles.add(operacion);
			}

		}
		return disponibles;
	}

	public OperacionDAO getOperacionDAO() {
		return operacionDAO;
	}

	public void setOperacionDAO(OperacionDAO operacionDAO) {
		this.operacionDAO = operacionDAO;
	}

	public GrupoDAO getGrupoDAO() {
		return grupoDAO;
	}

	public void setGrupoDAO(GrupoDAO grupoDAO) {
		this.grupoDAO = grupoDAO;
	}

	public List buscarGruposDisponibles(Transaccion transaccion) {
		// TODO Auto-generated method stub		
		List disponibles = new ArrayList();		
		List grupos = grupoDAO.loadAll();
		
		for (Iterator i = grupos.iterator(); i.hasNext();) {		
			Grupo grupo = (Grupo) i.next();
			boolean fueAsignado = false;
			
			for (Iterator j = transaccion.getGrupos().iterator(); j
					.hasNext();) {				
				Grupo asignado = (Grupo) j.next();				
				if (grupo.getId().equals(asignado.getId())) {					
					fueAsignado = true;
					break;
				}				
			}
			if (!fueAsignado) {				
				disponibles.add(grupo);
			}

		}		
		return disponibles;
	}

	public List buscarTiposDespliegue() {
		// TODO Auto-generated method stub		
		return tipoDespliegueDAO.loadAll();
	}

	public List buscarTiposTransaccion() {
		// TODO Auto-generated method stub		
		return tipoTransaccionDAO.loadAll();
	}

	public TipoDespliegueDAO getTipoDespliegueDAO() {
		return tipoDespliegueDAO;
	}

	public void setTipoDespliegueDAO(TipoDespliegueDAO tipoDespliegueDAO) {
		this.tipoDespliegueDAO = tipoDespliegueDAO;
	}

	public TipoTransaccionDAO getTipoTransaccionDAO() {
		return tipoTransaccionDAO;
	}

	public void setTipoTransaccionDAO(TipoTransaccionDAO tipoTransaccionDAO) {
		this.tipoTransaccionDAO = tipoTransaccionDAO;
	}

	public void validar(Transaccion transaccion) {
		// TODO Auto-generated method stub
		transaccionDAO.validate(transaccion);
	}

	public void validar(CarpetaTransaccion carpeta) {
		// TODO Auto-generated method stub
		carpetaTransaccionDAO.validate(carpeta);
	}

}
